﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace VKontakteClient
{
    /// <summary>
    /// Класс реализующий аудиозапись
    /// </summary>    
    public class Audio : MediaData, INotifyPropertyChanged
    {
        /// <summary>
        /// Перегруженное получение хэшкода
        /// </summary>
        public override int GetHashCode()
        {
            return base.GetHashCode() ^ (Lyrics??"").GetHashCode();
        }

        /// <summary>
        /// Перегруженный метод сравнения аудиозаписей.
        /// </summary>
        public override bool Equals(object obj)
        {
            var x = obj as Audio;
            if (base.Equals(obj) && x != null)
                return x.Lyrics == this.Lyrics;
            else return false;
        }

        /// <summary>
        /// Текст песни
        /// </summary>
        public string Lyrics { get; set; }

        /// <summary>
        /// Реальный прогресс воспроизведения
        /// </summary>
        private long _progress;

        /// <summary>
        /// Прогресс воспроизведения
        /// </summary>
        public long Progress
        {
            get
            {
                return _progress;
            }
            set
            {
                _progress = value;
                PropertyChangedCaller("Progress");
                PropertyChangedCaller("Status");
            }
        }

        /// <summary>
        /// Реальный максимальная длина аудиозаписи
        /// </summary>
        private long _maxProgress;

        /// <summary>
        /// Длина аудиозаписи
        /// </summary>
        public long MaximumProgress
        {
            get
            {
                return _maxProgress;
            }
            set
            {
                _maxProgress = value;
                PropertyChangedCaller("MaximumProgress");
                PropertyChangedCaller("Status");
            }
        }

        /// <summary>
        /// Преобразование секунд в адекватное человеческое восприятие.
        /// </summary>
        /// <param name="l"></param>
        /// <returns></returns>
        private static string longToTime(long l)
        {
            return Math.Floor((double)l / 60) + ":" + (((l % 60)<10)?"0":"")+(l%60);
        }

        /// <summary>
        /// Статус воспроизведения: [прошло времени]/[всего времени]
        /// </summary>
        public string Status
        {
            get
            {
                return longToTime(Progress) + "/" + longToTime(MaximumProgress);
            }
        }

        /// <summary>
        /// Дергатель события изменения свойства
        /// </summary>
        /// <param name="PropertyName">имя измененного свойства</param>
        private void PropertyChangedCaller(string PropertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
        }

        /// <summary>
        /// Событие изменения свойства
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;
    }
}
